package com.kl;


import com.kl.model.Person;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.junit.Test;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestFreemarker {

    // 指定模板所在的父目录
    private static final String BASE_DIR = "/Users/superlkl/IdeaProjects/middleware_study/freemarker_java/src/main/java/com/kl/";

    /**
     * 字符串渲染模板
     */
    @Test
    public void test_hello_world() throws IOException, TemplateException {
        Configuration conf = new Configuration();
        // 加载模板文件(模板的路径)
        conf.setDirectoryForTemplateLoading(new File(BASE_DIR));
        // 从根目录下加载模板
        Template template = conf.getTemplate("/ftl/hello-world.ftl");
        // 定义数据
        Map<String, String> root = new HashMap<>();
        root.put("world", "Hello World!!!");
        // 定义输出
        Writer out = new FileWriter(BASE_DIR + "/flttohtml/hello-world.html");
        // 渲染并输出
        template.process(root, out);
        System.out.println("转换成功");
        out.flush();
        out.close();
    }

    /**
     * 简单实体类型渲染模板
     */
    @Test
    public void test_entity_fill() throws IOException, TemplateException {
        Configuration conf = new Configuration();
        //加载模板文件(模板的路径)
        conf.setDirectoryForTemplateLoading(new File(BASE_DIR));
        // 加载模板
        Template template = conf.getTemplate("/ftl/person.ftl");
        // 定义数据
        Person person = new Person();
        person.setId(1);
        person.setName("小明");
        Map<String, Person> root = new HashMap<>();
        root.put("person", person);
        // 定义输出
        Writer out = new FileWriter(BASE_DIR + "/flttohtml/person.html");
        // 渲染并输出
        template.process(root, out);
        System.out.println("转换成功");
        out.flush();
        out.close();
    }

    /**
     * 集合类渲染模板
     */
    @Test
    public void test_list_fill() throws IOException, TemplateException {
        Configuration conf = new Configuration();
        //加载模板文件(模板的路径)
        conf.setDirectoryForTemplateLoading(new File(BASE_DIR));
        // 加载模板
        Template template = conf.getTemplate("/ftl/list.ftl");
        // 定义数据
        Person p1 = new Person();
        p1.setId(1);
        p1.setName("小明");
        Person p2 = new Person();
        p2.setId(2);
        p2.setName("小华");
        List<Person> person = new ArrayList<>();
        person.add(p1);
        person.add(p2);
        Map<String, List<Person>> root = new HashMap<>();
        root.put("person", person);
        // 定义输出
        Writer out = new FileWriter(BASE_DIR + "/flttohtml/list.html");
        template.process(root, out);
        System.out.println("转换成功");
        out.flush();
        out.close();
    }

    /**
     * 字典类渲染模板
     */
    @Test
    public void test_map_fill() throws IOException, TemplateException {
        Configuration conf = new Configuration();
        //加载模板文件(模板的路径)
        conf.setDirectoryForTemplateLoading(new File(BASE_DIR));
        // 加载模板
        Template template = conf.getTemplate("/ftl/map.ftl");
        // 定义数据
        Map<String, Map<String, String>> root = new HashMap<>();
        Map<String, String> mxs = new HashMap<>();
        mxs.put("fbb", "范冰冰");
        mxs.put("lbb", "李冰冰");
        root.put("mxs", mxs);
        // 定义输出
        Writer out = new FileWriter(BASE_DIR + "/flttohtml/map.html");
        template.process(root, out);
        System.out.println("转换成功");
        out.flush();
        out.close();
    }

    /**
     * 集合存储字典对象渲染模板
     */
    @Test
    public void test_list_map_fill() throws IOException, TemplateException {
        Configuration conf = new Configuration();
        //加载模板文件(模板的路径)
        conf.setDirectoryForTemplateLoading(new File(BASE_DIR));
        // 加载模板
        Template template = conf.getTemplate("/ftl/list-map.ftl");
        // 定义数据
        Map<String, List<Map<String, String>>> root = new HashMap<>();
        List<Map<String, String>> maps = new ArrayList<>();
        Map<String, String> pms1 = new HashMap<>();
        pms1.put("id1", "范冰冰");
        pms1.put("id2", "李冰冰");
        Map<String, String> pms2 = new HashMap<>();
        pms2.put("id1", "曾志伟");
        pms2.put("id2", "何炅");
        maps.add(pms1);
        maps.add(pms2);
        root.put("maps", maps);
        // 定义输出
        Writer out = new FileWriter(BASE_DIR + "/flttohtml/list-map.html");
        template.process(root, out);
        System.out.println("转换成功");
        out.flush();
        out.close();
    }

    private static final String TEMPLATE_PATH = "src/main/java/com/kl/";

    /**
     * 模板生成Java代码
     */
    @Test
    public void test_code_java() throws IOException, TemplateException {
        // step1 创建freeMarker配置实例
        Configuration configuration = new Configuration();
        Writer out;
        // step2 获取模版路径
        configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH));
        // step3 创建数据模型
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("classPath", "com.kl.entity");
        dataMap.put("className", "AutoCodeDemo");
        dataMap.put("helloWorld", "通过简单的 <代码自动生产程序> 演示 FreeMarker的HelloWorld！");
        // step4 加载模版文件
        Template template = configuration.getTemplate("ftltocode/code-hello.ftl");
        // step5 生成数据
        File docFile = new File(TEMPLATE_PATH + "entity/AutoCodeDemo.java");
        out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
        // step6 输出文件
        template.process(dataMap, out);
        System.out.println("AutoCodeDemo.java 文件创建成功!");
        out.flush();
        out.close();
    }
}
